#pragma once

#include <string>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>

using namespace std;

#define LS_IIC_PATH "/dev/ls_iic"

enum
{
    I2C_GET_GYRO_ID,    // 获取陀螺仪 ID
    I2C_GET_GYRO_TEM,   // 获取温度值
    I2C_GET_GYRO_NONE,  // 无操作
    I2C_GET_GYRO_ANG,   // 获取角速度值
    I2C_GET_GYRO_ACC    // 获取加速度值
};

// 龙芯I2C驱动相关使用类
class LS_I2C_DEV
{
public:
    /*!
    * @brief   I2C 驱动相关类无参构造函数
    * @param   无
    * @return  无
    * @date    2025/3/20
    */
    LS_I2C_DEV();

    /*!
    * @brief   I2C 驱动相关类有参构造函数
    * @param   path : I2C 驱动生成的设备文件路径
    * @return  无
    * @date    2025/3/20
    */
    LS_I2C_DEV(const string &path);

    /*!
    * @brief   初始化陀螺仪
    * @param   path : I2C 驱动生成的设备文件路径
    * @return  成功返回 0，失败返回 -1
    * @date    2025/3/20
    */
    int8_t I2C_Init(const string &path);

    /*!
    * @brief   获取陀螺仪 ID
    * @param   无
    * @return  返回陀螺仪 ID
    * @date    2025/3/20
    */
    uint8_t I2C_Get_ID(void);

    /*!
    * @brief   获取温度值
    * @param   无
    * @return  温度值
    * @date    2025/3/20
    */
    int16_t I2C_Get_Tem(void);

    /*!
    * @brief    获取角速度值
    * @param    gx,gy,gz : 陀螺仪 x,y,z 轴的角速度值原始读数(带符号)
    * @return   成功返回 0，失败返回 -1
    * @date     2025/3/20
    */
    int8_t I2C_Get_Ang(int16_t *gx, int16_t *gy, int16_t *gz);

    /*!
    * @brief    获取加速度值
    * @param    ax,ay,az : 陀螺仪 x,y,z 轴的加速度值原始读数(带符号)
    * @return   成功返回 0，失败返回 -1
    * @date     2025/3/20
    */
    int8_t I2C_Get_Acc(int16_t *ax, int16_t *ay, int16_t *az);

    /*!
    * @brief    获取陀螺仪加速度值、角速度值
    * @param    ax,ay,az : 陀螺仪 x,y,z 轴的加速度值原始读数(带符号)
    * @param    gx,gy,gz : 陀螺仪 x,y,z 轴的角速度值原始读数(带符号)
    * @return   成功返回 0
    * @date     2025/3/20
    */
    int8_t I2C_Get_RawData(int16_t *ax, int16_t *ay, int16_t *az, int16_t *gx, int16_t *gy, int16_t *gz);

    /*!
    * @brief   I2C 驱动相关类析构函数
    * @param   无
    * @return  无
    * @date    2025/3/20
    */
    ~LS_I2C_DEV();
private:
    int I2C_fd;
};
